//
//  CHCrashNote.m
//  CHSimpleUI
//
//  Created by cyptt on 2022/12/8.
//

#import "CHCrashNote.h"


@implementation CHCrashNote

static CHCrashNote * _manage= nil;

+(instancetype)shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_manage == nil) {
            _manage = [[self alloc]init];
        
        }
    });
    return _manage;
}


-(void)configExceptionHandler{
    
    //NSSetUncaughtExceptionHandler仅适用于NSExceptions
    //要捕获Swift运行时错误，请对SIGTRAP实施信号处理程序。据我所知，如果Swift代码在运行时检测到意外情况，它将以SIGTRAP异常类型终止程序，即只有SIGTRAP有助于捕获Swift错误，其余的如SIGSEGV，SIGBUS，不起作用。
    NSSetUncaughtExceptionHandler(&crashExceptionHandler);
   
}

void crashExceptionHandler(NSException * exception){
    
    NSLog(@"exception-----%@",exception);
    // 异常的堆栈信息
    NSArray * stackArray = [exception callStackSymbols];
    
    // 出现异常的原因
    NSString *reason = [exception reason];
    
    // 异常名称
    NSString *name = [exception name];
    
    // 插件调用记录
    NSString *pluginCallHistory = @"";

   
    // 之前的错误信息

        NSString *errPath = [NSString stringWithFormat:@"%@/Documents/OutWorkException.txt",NSHomeDirectory()];

        NSData *data = [NSData dataWithContentsOfFile:errPath];

        NSString *errStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSString *lastError = @"";

        if (errStr && [errStr isKindOfClass:[NSString class]] && errStr.length > 0) {

            lastError = [NSString stringWithFormat:@"%@\n\n", errStr];

        }
    // 拼接错误信息

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        NSString *currentTime = [formatter stringFromDate:[NSDate date]];

        NSString *exceptionInfo = [NSString stringWithFormat:@"插件调用记录:\n%@%@\nException name：%@\nException reason：%@\nException stack：%@\n\n", pluginCallHistory,currentTime, name, reason, stackArray];

        // 拼接上之前的错误信息

        NSString *result = [NSString stringWithFormat:@"%@%@", exceptionInfo, lastError];

        //保存到本地  --  当然你可以在下次启动的时候，上传这个log

        [result writeToFile:errPath  atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
}
@end
